코딩테스트 연습 - 이상한 문자 만들기 | 프로그래머스 스쿨
[ 템플릿 코드 ]
#include <string>
#include <vector>
using namespace std;
string solution(string s) {
string answer = "";
return answer;
}[ 풀이 ]
#include <string>
#include <vector>
using namespace std;
string solution(string s)
{
int count = 0;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == ' ')
{
count = 0;
}
else
{
if(count % 2 == 0)
{
if(s[i] >= 'a' && s[i] <= 'z')
s[i] -= 32;
}
else
{
if(s[i] >= 'A' && s[i] <= 'Z')
s[i] += 32;
}
count++;
}
}
return s;
}[ 해설 ]
#include <string> // string 자료형 사용
#include <vector> // 현재 코드에서는 사용하지 않음
using namespace std; // std::string, std::vector 등을 std 없이 사용
string solution(string s)
{
int count = 0; // 현재 단어에서 몇 번째 문자인지 저장
// 공백을 만나면 다시 0으로 초기화
// 문자열의 처음부터 끝까지 반복
for(int i = 0; i < s.size(); i++)
{
// 현재 문자가 공백인지 확인
if(s[i] == ' ')
{
count = 0; // 새로운 단어가 시작되므로 인덱스 초기화
}
else
{
// 현재 단어에서 짝수 번째 문자라면
if(count % 2 == 0)
{
// 현재 문자가 소문자인지 확인
if(s[i] >= 'a' && s[i] <= 'z')
s[i] -= 32; // 소문자를 대문자로 변환
}
else // 현재 단어에서 홀수 번째 문자라면
{
// 현재 문자가 대문자인지 확인
if(s[i] >= 'A' && s[i] <= 'Z')
s[i] += 32; // 대문자를 소문자로 변환
}
// 공백이 아닌 문자를 처리했으므로
// 현재 단어의 문자 순서를 1 증가
count++;
}
}
// 변환이 완료된 문자열 반환
return s;
}[ 타 답안 ]
#include <string> // string(문자열) 자료형을 사용하기 위한 헤더 파일
using namespace std; // std::string 대신 string처럼 std::를 생략해서 사용
string solution(string s) {
int idx = 0; // 현재 단어에서 몇 번째 문자인지 저장하는 변수
// 단어가 바뀌면 다시 0부터 시작
// 문자열 s의 문자를 처음부터 끝까지 하나씩 꺼내서 c에 저장
// auto : 자료형을 자동으로 추론 (여기서는 char)
// & : 참조(Reference), c를 수정하면 원본 문자열 s도 함께 수정됨
for(auto& c : s) {
// idx & 1
// -> idx가 홀수이면 1(true)
// -> idx가 짝수이면 0(false)
//
// 삼항 연산자
// 조건 ? 참일때 : 거짓일때
//
// idx가 홀수면 tolower(c) 실행
// -> 현재 문자를 소문자로 변경
//
// idx가 짝수면 toupper(c) 실행
// -> 현재 문자를 대문자로 변경
//
// 변경된 문자를 다시 c에 저장
c = idx & 1 ? tolower(c) : toupper(c);
// 현재 문자가 공백인지 확인
//
// 공백이라면
// -> 다음 문자는 새로운 단어의 첫 글자
// -> idx를 0으로 초기화
//
// 공백이 아니라면
// -> 현재 단어의 다음 문자로 이동
// -> idx를 1 증가
//
// 삼항 연산자 형태
// 조건 ? 참일때값 : 거짓일때값
idx = c == ' ' ? 0 : idx + 1;
}
// 변환이 완료된 문자열 반환
return s;
}